package myself.study.network.tcp.demo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
* @Name: TcpServerDemo
* @Description: TCP服务端响应类
* TCP服务端使用的类：ServerSocket
* 说明：此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作，然后可能向请求者返回结果。 
* 步骤：
* 	1、创建服务端Socket对象
* 		ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
* 	2、监听客户端连接，返回一个对应的Socket对象
* 		public Socket accept() 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。 
* 	3、获取输入流对象，接收客户端请求数据(使用Socket对象的方法)
* 		public InputStream getInputStream() 返回此套接字的输入流。 
* 		public InetAddress getInetAddress() 返回套接字连接的地址。 此套接字连接到的远程 IP 地址；如果套接字是未连接的，则返回 null。
* 		public int getPort() 返回此套接字连接到的远程端口。  此套接字连接到的远程端口号；如果尚未连接套接字，则返回 0。
* 	4、获取输出流对象，向客户端发送响应结果(使用Socket对象的方法)
* 		public OutputStream getOutputStream() 返回此套接字的输出流。 
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-1-12 上午11:09:12 
* @Version: V1.0
 */
public class TcpServerDemo {
	
	public static void main(String[] args) throws IOException {
		//创建服务端Socket对象
		ServerSocket server = new ServerSocket(12345) ;
		System.out.println("启动TCP服务器...");
		InputStream inputStream = null ;
		OutputStream outputStream = null ;
		Socket socket = null ;
		while(true) {
			try {
				//监听客户端连接，返回一个对应的Socket对象，该方法为阻塞方法
				socket = server.accept() ;
				//获取输入流对象，接收客户端请求数据
				inputStream = socket.getInputStream() ;
				//解析客户端数据
				byte[] buf = new byte[1024] ;
				int len = inputStream.read(buf) ;
				String requestData = new String(buf, 0, len) ;
				//获取客户端ip地址
				String hostAddress = socket.getInetAddress().getHostAddress() ;
				System.out.println("from client[" + hostAddress + "] : " + requestData);
				//处理数据，休眠2秒 ...
				Thread.sleep(2000) ;
				//处理结果
				String responseData = "ok,知道了,忙你的吧!" ;
				//获取输出流对象，向客户端响应处理结果
				outputStream = socket.getOutputStream() ;
				outputStream.write(responseData.getBytes()) ;
				System.out.println("to client[" + hostAddress + "] : " + responseData);
			} catch (Exception e) {
				e.printStackTrace() ;
			} finally {
				//释放资源
				if(socket != null) {
					socket.close() ;
				}
			}
		} 
	}

}
